#!/bin/bash
# author:lixiang
# 数据批量混合噪音，随机取噪音文件的某一段，并把记录保存在log.txt
# ffmpeg版

# 数据文件目录
orig_ch1_dir=$1
orig_ch2_dir=$2

log_txt="log.txt"
rm -rf ${orig_ch1_dir}_noise ${orig_ch2_dir}_noise $log_txt d.log f.log

echo "*****************************************************************************************************************" >> f.log
# 生成指定范围随机数
function rand_func(){
    min=$1
    max=$(($2-$min+1))
    num=$(date +%s%N)
    echo $(($num%$max+$min))
}

# 统计目录数量和音频文件数量
DS=0
FS=0

# 噪音文件时长
n_file_duration=3604
# 发话文文件时长
d_file_duration=10

# 递归遍历数据目录
function mixin_func(){
    for file in `ls $1`
    do
        if [ -d $1"/"$file ]  
        then
            ((DS++))
            # echo $1"/"$file
            mkdir -p $2"/"$file
            mixin_func $1"/"$file $2"/"$file $3
        else
            # 如果是wav文件，则执行ffmpeg
            if [ "${file##*.}" = "wav" ]; then
                ((FS++))
                # d_file_duration=`ffprobe -v quiet -print_format json -show_format $1"/"$file | awk -F 'format' '/duration/{print $1}'`
                # echo $d_file_duration
                # 随机取噪音文件的某一段
                if [ "$3" == "false" ]
                then
                    rnd=$(rand_func 1 $n_file_duration-$d_file_duration)
                    echo $rnd $d_file_duration $1"/"$file >> $log_txt 
                fi
                start_time=`cat $log_txt|sed -n ${FS}p|awk -F ' ' '{print $1}'`

                ffmpeg -i $1"/"$file -i $noise_path -filter_complex "[0:a]volume=2[a0];[1:a]volume=2,atrim=start=$start_time:duration=$d_file_duration[a1];[a0][a1]amix=inputs=2:duration=first[a]" -map "[a]" -shortest  -y $2"/"$file >>d.log 2>&1
                echo $? $1"/"$file
                echo [`date '+%Y-%m-%d %H:%M:%S'`] $? ffmpeg -i $1"/"$file -i $noise_path -filter_complex "[0:a]volume=2[a0];[1:a]volume=2,atrim=start=$start_time:duration=$d_file_duration[a1];[a0][a1]amix=inputs=2:duration=first[a]" -map "[a]" -shortest  -y $2"/"$file >> f.log
            fi
        fi
    done
}

# 调用方法，开始处理音频
# channel 1
noise_path="noise/ch1.wav"
mixin_func $orig_ch1_dir ${orig_ch1_dir}_noise false

echo "channel 1 ok"
echo "${DS} dictories,${FS} files"

DS=0
FS=0
# channel 2
noise_path="noise/ch2.wav"
mixin_func $orig_ch2_dir ${orig_ch2_dir}_noise true

echo "channel 2 ok"
echo "${DS} dictories,${FS} files"